'use strict';
/**
 * author：小小游 --- allen
 * date：2018.02.04
 * lastUpdateDate：2018.02.04
 * description：Promise的诞生来解决异步式嵌套回调的问题
 */
// for example：
/**
 * Promise本身接收两个参数，一个是resolve函数，一个是reject函数
 * resolve函数表示接收过程当中有了正确结果之后会去调用它，并且把正确结果传导给它
 * reject函数表示接收过程当中有了错误结果之后会去调用它，并且把错误结果传导给它
 * new Promise ((resolve, reject) => {
 *
 * });
 */
class User {
    constructor (name, password) {
        this.name = name;
        this.password = password;
    }

    validateNameMethod () {
        let name = this.name;
        return new Promise((resolve, reject) => {
            setTimeout (() => {
                if (name === 'allen') {
                    resolve ('success!');
                } else {
                    reject ('error!');
                }
            }, 200);
        });
    }

    validatePasswordMethod () {
        let password = this.password;
        return new Promise((resolve, reject) => {
            setTimeout (() => {
                if (password === '123456') {
                    resolve ('success!');
                } else {
                    reject ('error!');
                }
            }, 200)
        });
    }
}

// 使用Promise解决异步回调问题
/**
 * 1.那么当我们调用这个asyncFun()函数的时候，它返回的是一个Promise，
 * 也就是说无论它返回的是一个成功的Promise还是错误的Promise，那么
 * 它的then方法就会被执行，then函数的第一个参数就是Promise对象成功
 * 的回调，第二个参数就是Promise对象失败的回调，这个要理解好
 * 2.从逻辑的清晰度上，用then的方式一步步的运算，相对通过不断嵌套式
 * 的回调方式更加优雅，而且逻辑更加的清晰
 */
// 下面的写法进行串行化处理
// let user = new User('xiaoyou');
let user = new User('allen', '123456');
user.validateNameMethod()
    .then ((nameValidateOfSuccessResult) => {
        console.log(`this is success of name's validate ${nameValidateOfSuccessResult}`);
        // 返回个下一个Promise对象继续调用then方法校验密码是否输入正确
        // return user.validatePasswordMethod();
        /**
         * 这里简单解释下，如下：
         * 如果此处返回的是一个类似这样的字符串，比如'validate name success!'
         * 那么其实它内部原理剖析是这样的，首先：
         * 1.var promise = Promise.resolve('validate name success!');，
         * 返回一个成功的Promise对象
         * 2.var promise = new Promise ((resolve, reject) => {
         *     resolve ('validate name success!');
         * });
         * 那么自然它也可以调用then方法继续往下执行，最终返回结果
         */
        return 'validate name success!';
    })
    .then ((result) => {
        // 那么这个结果也是可以打印出来的
        console.log(result);
    });
